#include "sys.h"
#include "stm32f4xx.h"
#include "delay.h"
#include "PS_two.h"

void PS_two_GPIO_config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
	GPIO_Init(GPIOE,&GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;
	GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_DOWN;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
	GPIO_Init(GPIOE,&GPIO_InitStructure);
}

void send_to_ps2_byte(u8 s_byte)
{
    u8 i;
    for(i=0;i<8;i++)
    {
			 if(s_byte & 0x01) DO_H;
       else DO_L;
        s_byte>>=1;
        CLK_H;
        delay_us(5);
        CLK_L;
        delay_us(5);
        CLK_H;
    }
    delay_us(16);
}
 
u8 Recieve_form_PS2_Byte(void)
{
    u8 i,r_byte;
    for(i=0;i<8;i++)
    {
        CLK_H;
        delay_us(5);
        CLK_L;
        delay_us(5);
        CLK_H;
        r_byte<<=1;
        if(DI_READ)
            r_byte |= 0x01; 
    }
    delay_us(16);
    return r_byte;
}

u8 ps_two_dat[7];
void PS2_Simple_Recieve(u8 *dat)
{
		CS_L;
		send_to_ps2_byte(0x01);
		send_to_ps2_byte(0x42);
		dat[0]=Recieve_form_PS2_Byte();
		dat[1]=Recieve_form_PS2_Byte();
		dat[2]=Recieve_form_PS2_Byte();
		dat[3]=Recieve_form_PS2_Byte();
		dat[4]=Recieve_form_PS2_Byte();
		dat[5]=Recieve_form_PS2_Byte();
		dat[6]=Recieve_form_PS2_Byte();
		CS_H;
}
